package com.bifrost.util;

import com.bifrost.entity.Category;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 * @author Lee
 * Create Class on 2018/5/9
 * @com.bifrost.util
 * @WMALL_DQ
 */
@Component
@Slf4j
public class SequenceUtil {

    /** 默认使用primary EntityManager （多数据源可以通过name 指定获取 entityManager）*/
    @PersistenceContext
    EntityManager em;

    /**
     * 根据序列名称 获取下一个序列值 （使用jvm级别（当前this 单例模式 方法加锁）的锁 , jvm多实例 还是有并发问题  并没有采用数据库行锁）
     * @param sequenceName 序列名称
     * @return
     */
    public synchronized String getSequence(String sequenceName) {
        System.out.print(em);
        Query query = em.createNativeQuery("SELECT nextval('" + sequenceName + "')");
        return query.getSingleResult().toString().trim();
    }

    /**
     *  根据分类ExternalId 和 sku序列id 进行组装
     * @param category
     * @return
     */
    public String getSkuCode(Category category) {
        String categoryExternalId = category.getExternalId()==null?"":category.getExternalId();
        if(StringUtils.isNotBlank(categoryExternalId)){
            categoryExternalId =categoryExternalId.trim().substring(0,2);
        }
        String skuSequence = getSequence("sku_sequence");
        if(StringUtils.isBlank(skuSequence)){
            log.error("获取序列失败..");
            throw new RuntimeException("保存失败, 请稍后再试..");
        }
        String skuCode=String.format("%s%s",categoryExternalId,skuSequence);
        // 保证sku_Code 最小长度10
        if(skuCode.length()<11){
            String repair="";
            for (int i = skuCode.length()+1 ; i< 11; i++){
                repair = String.format("%s%s",repair,"0");
            }
            skuCode = String.format("%s%s%s",categoryExternalId,repair,skuSequence);
        }
        return skuCode;
    }

}
